﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
//qsort 函数的模拟实现
int int_comp(const void* e1, const void* e2)
//只是调用函数来比较大小，并不希望元素的值被修改所以用const来修饰
//因为你想让这个函数可以比较任意数据类型的大小，并且数据 的类型你并不明确，所以你需要用void*，他可以接收任意 类型的数据
{
	return (*(int*)e1 - *(int*)e2);//根据>0,<0,==0的结果,进行比较大小
}
void swap(void* e1, void* e2,int width)
{
	//对地址进行一个字节一个字节的交换
	for (int i = 0; i < width; i++)
	{
		char tmp = *((char *)e1 + i);
		*((char*)e1 + i) = *((char*)e2 + i);
		* ((char *)e2 + i) = tmp;

	}
}
void bubble(void* base, size_t sz, int width, int (*comp)(void* , void* ))
{
	int i = 0, j = 0;
	for (i = 0; i < sz - 1; i++)//确定趟数
	{
		//确定一趟冒泡排序的过程
		for (j = 0; j < sz - 1 - i; j++)
		{
			//需要对交换和比较的部分进行改造
			if (comp((char*)base + j * width, (char*)base + (j + 1) * width) > 0)// 比较部分改造之后的代码（因为viod* 不能直接进行+ -,也不能直接解引用）
			{
				swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
			}
		}
	}
}
int main1()
{
	int arr[] = { 7,4,1,8,5,2,9,6,3,0 };
	int sz = sizeof(arr) / sizzeof(arr[0]);
	/* qsort 这个函数有4个参数：void* base 指向待排序的第一个元素：size_t num 待排序的元素个数；int(*compare)(const void*e1,const void*e2):compare 是个函数指针，指向的函数可以比较2个元素大小*/
	bubble(arr, sz, sizeof(int), int_comp);

	return 0;
}
int main()
{
	int i = 1;
	for (i = 1; i < 99999; i++)
	{
		int tmp = i;
		int count = 0;//表示统计一个数的位数
		int sum = 0;
		while (tmp)//求一个数的位数，利用整数除法向下取整的特性
		{
			count++;
			tmp /= 10;
		}
		tmp = i;
		while (tmp)
		{
			sum += pow(tmp % 10, count);//pow 表示求一个数的n 次方，即求 tmp % 10 的 count次方
			tmp /= 10;//依次去掉一个数的个位数
		}
		if (sum == i)
		{
			printf("count位数的有:%d ", i);
		}
	}
	return 0;
}